001 /* EVolve - an Extensible Software Visualization Framework 002 * Copyright (C) 2001-2002 Qin Wang 003 * 004 * This library is free software; you can redistribute it and/or 005 * modify it under the terms of the GNU Library General Public 006 * License as published by the Free Software Foundation; either 007 * version 2 of the License, or (at your option) any later version. 008 * 009 * This library is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 012 * Library General Public License for more details. 013 * 014 * You should have received a copy of the GNU Library General Public 015 * License along with this library; if not, write to the 016 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 017 * Boston, MA 02111-1307, USA. 018 */ 019 020 /* 021 * EVolve is distributed at http://www.sable.mcgill.ca/EVolve/ 022 */ 023 024 package EVolve.visualization; 025 026 import EVolve.*; 027 import EVolve.exceptions.NoDataPlotException; 028 import EVolve.data.*; 029 import EVolve.util.*; 030 import java.util.*; 031 032 public class ReferenceDimension extends Dimension implements Cloneable{ 033 private ArrayList comparatorList; 034 private int currentOrder; 035 private int[] order; 036 private int [] orderBfUnify; 037 private Entity[] entity; 038 private HashSet linkedEntity; 039 private int selectedIndex; 040 private int entityNumber; 041 private HashMap Int2Entity, EntityName2Int; 042 private Sorter sorter; 043 044 public ReferenceDimension() { 045 comparatorList = new ArrayList(); 046 linkedEntity = null; 047 selectedIndex = 0; 048 entityNumber = -1; 049 Int2Entity = new HashMap(); 050 EntityName2Int = new HashMap(); 051 orderBfUnify = null; 052 } 053 054 public int getMaxEntityNumber() { 055 return Scene.getDataManager().getEntity()[dataFilter.getTargetType()].size(); 056 } 057 058 public int getEntityNumber() { 059 return entity==null ? -1 : entity.length; 060 } 061 062 public long getField(Element element) { 063 long returnVal = dataFilter.getData(element); 064 Integer mappedId = findMappedId(returnVal); 065 066 if (order[mappedId.intValue()] == Integer.MAX_VALUE) { 067 order[mappedId.intValue()] = currentOrder; 068 currentOrder++; 069 } 070 return mappedId.intValue(); 071 } 072 073 public void preVisualize() { 074 currentOrder = 0; 075 EntityName2Int.clear(); 076 Int2Entity.clear(); 077 order = new int[getMaxEntityNumber()]; 078 for (int i = 0; i < order.length; i++) { 079 order[i] = Integer.MAX_VALUE; 080 } 081 } 082 083 public void restore() { 084 order = new int[getMaxEntityNumber()]; 085 for (int i = 0; i < order.length; i++) { 086 if (i<currentOrder) 087 order[i] = i; 088 else 089 order[i] = Integer.MAX_VALUE; 090 } 091 linkedEntity = null; 092 093 ArrayList tobeDel = new ArrayList(); 094 Iterator it = Int2Entity.keySet().iterator(); 095 while (it.hasNext()) { 096 Integer key = (Integer)it.next(); 097 if (key.intValue() >= currentOrder) { 098 tobeDel.add(key); 099 } 100 } 101 for (int i=0; i<tobeDel.size(); i++) { 102 Int2Entity.remove(tobeDel.get(i)); 103 } 104 105 tobeDel.clear(); 106 it = EntityName2Int.keySet().iterator(); 107 while (it.hasNext()) { 108 Object key = it.next(); 109 Integer value = (Integer)EntityName2Int.get(key); 110 if (value.intValue() >= currentOrder) { 111 tobeDel.add(key); 112 } 113 } 114 for (int i=0; i<tobeDel.size(); i++) { 115 EntityName2Int.remove(tobeDel.get(i)); 116 } 117 } 118 119 public void visualize() throws NoDataPlotException{ 120 121 if (linkedEntity == null) { 122 entity = new Entity[currentOrder]; 123 124 for (int i = 0; i < order.length; i++) { 125 if (order[i] != Integer.MAX_VALUE) { 126 entity[order[i]] = (Entity)Int2Entity.get(new Integer(i)); 127 } 128 } 129 } else { // unified reference dimension 130 int free = currentOrder; 131 entityNumber = currentOrder; 132 entity = new Entity[linkedEntity.size()]; 133 134 order = new int[linkedEntity.size()]; 135 Iterator it = linkedEntity.iterator(); 136 while (it.hasNext()) { 137 Entity aEntity = (Entity)it.next(); 138 Integer mappedId = (Integer)EntityName2Int.get(aEntity.getName()); 139 if (mappedId != null) { 140 order[mappedId.intValue()] = mappedId.intValue(); 141 entity[order[mappedId.intValue()]] = aEntity; 142 } else { 143 Int2Entity.put(new Integer(free), aEntity); 144 EntityName2Int.put(aEntity.getName(), new Integer(free)); 145 order[free] = Integer.MAX_VALUE; 146 entity[free] = aEntity; 147 free++; 148 } 149 } 150 } 151 152 comparatorList.clear(); 153 comparatorList.add(new LexicalComparator()); 154 comparatorList.add(new ValueComparator("Temporal", true, order, EntityName2Int)); 155 ArrayList entityComparatorList = ((EntityDefinition)(Scene.getDataManager().getElementDefinition()[dataFilter.getTargetType()])).getComparator(); 156 for (int i = 0; i < entityComparatorList.size(); i++) { 157 comparatorList.add(entityComparatorList.get(i)); 158 } 159 160 sorter = new Sorter(entity, (EntityComparator)(comparatorList.get(selectedIndex))); 161 162 // we generate an exception on purpose for empty image 163 if (entity.length == 0) throw new NoDataPlotException(); 164 } 165 166 public Entity getEntity(int index) { 167 int newMappedId = (sorter == null) ? index : sorter.getSource(index); 168 169 if (Int2Entity.containsKey(new Integer(newMappedId))) { 170 return (Entity)Int2Entity.get(new Integer(newMappedId)); 171 } 172 173 return null; 174 } 175 176 public ArrayList getComparator() { 177 return comparatorList; 178 } 179 180 public void selectComparator(int selectedIndex) { 181 sorter = new Sorter(entity, (EntityComparator)(comparatorList.get(selectedIndex))); 182 this.selectedIndex = selectedIndex; 183 } 184 185 public void addComparator(EntityComparator comparator) { 186 boolean found = false; 187 for (int i=0; i<comparatorList.size(); i++) { 188 if (((EntityComparator)comparatorList.get(i)).getName().equals(comparator.getName())) 189 found = true; 190 } 191 if (!found) comparatorList.add(comparator); 192 } 193 194 public int getSortedIndex(int mappedId) { 195 if (order[mappedId] == Integer.MAX_VALUE) { 196 return -1; 197 } else { 198 return sorter.getTarget(order[mappedId]); 199 } 200 } 201 202 public int getOriginMappedId(int sortedId) { 203 int mappedId = sorter.getSource(sortedId); 204 return mappedId; 205 } 206 207 public void makeSelection(int sourceType, int[] selection) { 208 if (selection.length != 0) { 209 long[] selected = new long[selection.length]; 210 for (int i = 0; i < selected.length; i++) { 211 selected[i] = getEntity(selection[i]).getId(); 212 } 213 Scene.getFilter().addSelection(new Selection(sourceType,dataFilter.getTargetType(), selected, 0, Long.MAX_VALUE,null)); 214 } 215 } 216 217 public void makeSelection(int sourceType, int[] selection, long start, long end, ArrayList timeMap) { 218 if (selection.length != 0) { 219 long[] selected = new long[selection.length]; 220 for (int i = 0; i < selected.length; i++) { 221 selected[i] = getEntity(selection[i]).getId(); 222 } 223 Scene.getFilter().addSelection(new Selection(sourceType, dataFilter.getTargetType(), selected, start, end, timeMap)); 224 } 225 } 226 227 public Entity[] getEntities() { 228 return entity; 229 } 230 231 public void linkEntities(HashSet linkedEntity) { 232 if (this.linkedEntity != null) 233 restore(); 234 this.linkedEntity = linkedEntity; 235 } 236 237 public void clearEntityMap() { 238 linkedEntity = null; 239 entity = null; 240 entityNumber = -1; 241 } 242 243 public int getSelectedComparatorIndex() { 244 return selectedIndex; 245 } 246 247 public String getSelectedComparatorName() { 248 249 return ((EntityComparator)comparatorList.get(selectedIndex)).getName(); 250 } 251 252 public int[] getOrdering() { 253 if (orderBfUnify == null) 254 return order; 255 else 256 return orderBfUnify; 257 } 258 259 public void updateOrdering(int[] newOrder) { 260 if (orderBfUnify == null) 261 orderBfUnify = order; 262 order = newOrder; 263 } 264 265 public int getEntityNumberBeforeLink() { 266 return entityNumber; 267 } 268 269 public HashMap getEntityName2IntMap() { 270 return EntityName2Int; 271 } 272 273 public HashMap getInt2EntityMap() { 274 return Int2Entity; 275 } 276 277 public Entity getEntityFromInt(int mappedId) { 278 Integer key = new Integer(mappedId); 279 if (Int2Entity.containsKey(key)) { 280 return (Entity)Int2Entity.get(key); 281 } else 282 return null; 283 } 284 285 private Integer findMappedId(long entityId) { 286 Long value = new Long(entityId); 287 Entity entity = (Entity)Scene.getDataManager().getEntity()[dataFilter.getTargetType()].get(value); 288 289 if (EntityName2Int.containsKey(entity.getName())) { 290 return (Integer)EntityName2Int.get(entity.getName()); 291 } else { 292 Integer mappedId = new Integer(Int2Entity.size()); 293 Int2Entity.put(mappedId,entity); 294 EntityName2Int.put(entity.getName(),mappedId); 295 return mappedId; 296 } 297 } 298 299 public Object clone() { 300 ReferenceDimension o = (ReferenceDimension) super.clone(); 301 o.comparatorList = (ArrayList)comparatorList.clone(); 302 o.comparatorList.clear(); 303 for (int i=0; i<comparatorList.size(); i++) { 304 o.comparatorList.add(((EntityComparator)comparatorList.get(i)).clone()); 305 } 306 o.entity = null; 307 if (entity != null) { 308 o.entity = new Entity[entity.length]; 309 for (int i=0; i<o.entity.length; i++) 310 o.entity[i] = entity[i]; 311 } 312 o.linkedEntity = HelperFuncs.cloneHashSet(linkedEntity); 313 o.Int2Entity = HelperFuncs.cloneHashMap(Int2Entity); 314 o.EntityName2Int = HelperFuncs.cloneHashMap(EntityName2Int); 315 316 o.order = null; 317 if (order != null) { 318 o.order = new int[order.length]; 319 for (int i=0; i<order.length; i++) { 320 o.order[i] = order[i]; 321 } 322 } 323 324 o.sorter = (sorter == null) ? null : (Sorter)sorter.clone(); 325 return o; 326 } 327 }